Estoy confundido. Después de tropezar con este hilo, traté de descubrir cómo formatear un temporizador de cuenta regresiva que tenía el formato hh:mm:ss .
Aquí está mi intento -
//hh:mm:ss String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))); Entonces, cuando pruebo un valor como 3600000ms , obtengo 01:59:00 , lo cual es incorrecto ya que debería ser 01:00:00 . Obviamente hay algo mal con mi lógica, pero por el momento, ¡no puedo ver qué es!
¿Alguien puede ayudar?
Editar -
Arreglado. Esta es la forma correcta de formatear milisegundos en formato hh:mm:ss :
//hh:mm:ss String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)))); El problema era este TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)) . Debería haber sido este TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)) en su lugar.
Estabas muy cerca:
String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));Estabas convirtiendo horas a milisegundos usando minutos en lugar de horas .
Por cierto, me gusta tu uso de la API de TimeUnit :)
Aquí hay un código de prueba:
public static void main(String[] args) throws ParseException { long millis = 3600000; String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))); System.out.println(hms); }Producción:
01:00:00Me di cuenta de que mi código anterior se puede simplificar mucho usando una división de módulo en lugar de una resta:
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1), TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1)); Sigo usando la API de TimeUnit para todos los valores mágicos y da exactamente el mismo resultado.
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));Si está utilizando apache commons:
DurationFormatUtils.formatDuration(timeInMS, "HH:mm:ss,SSS");